home *** CD-ROM | disk | FTP | other *** search
-
- {MOUSE.PAS creates MOUSE.TPU Unit}
- {From the book "OBJECT ORIENTED PROGRAMMING IN TURBO PASCAL 5.5"}
-
- Unit Mouse;
-
- Interface
-
- Type
- GCursor = record
- ScreenMask,
- CursorMask : array[0..15] of word;
- hotX,hotY : integer;
- end; {record}
-
-
- {================================}
- {Graphics Cursors are predefined }
- {for use with GraphicMouse }
- {================================}
-
-
- Const {The graphics cursors are defined as constants }
-
- HAMMER : GCursor = {As in the hammer of THOR, my favorite}
- (ScreenMask : ($8003,$0001,$0001,$1831,
- $1011,$0001,$0001,$8003,
- $F83F,$F83F,$F83F,$F83F,
- $F83F,$F83F,$F83F,$F83F);
- CursorMask : ($0000,$3FF8,$4284,$4104,
- $4284,$4444,$3FF8,$0380,
- $0380,$0380,$0380,$0380,
- $0380,$0380,$0380,$0000);
- HotX : $0007;
- HotY : $0003);
-
- ARROW : GCursor = {Your run-of-the-mill Graphics Arrow cursor}
- (ScreenMask : ($1FFF,$0FFF,$07FF,$03FF,
- $01FF,$00FF,$007F,$003F,
- $001F,$003F,$01FF,$01FF,
- $E0FF,$F0FF,$F8FF,$F8FF);
- CursorMask : ($0000,$4000,$6000,$7000,
- $7800,$7C00,$7E00,$7F00,
- $7F80,$7C00,$4C00,$0600,
- $0600,$0300,$0400,$0000);
- HotX : $0001;
- HotY : $0001);
-
- CHECK : GCursor = {A check-mark cursor}
- (ScreenMask : ($FFF0,$FFE0,$FFC0,$FF81,
- $FF03,$0607,$000F,$001F,
- $803F,$C07F,$E0FF,$F1FF,
- $FFFF,$FFFF,$FFFF,$FFFF);
- CursorMask : ($0000,$0006,$000C,$0018,
- $0030,$0060,$70C0,$3980,
- $1F00,$0E00,$0400,$0000,
- $0000,$0000,$0000,$0000);
- HotX : $0005;
- HotY : $0010);
-
- CROSS : GCursor = {A circle with center cross cursor}
- (ScreenMask : ($F01F,$E00F,$C007,$8003,
- $0441,$0C61,$0381,$0381,
- $0381,$0C61,$0441,$8003,
- $C007,$E00F,$F01F,$FFFF);
- CursorMask : ($0000,$07C0,$0920,$1110,
- $2108,$4004,$4004,$783C,
- $4004,$4004,$2108,$1110,
- $0920,$07C0,$0000,$0000);
- HotX : $0007;
- HotY : $0007);
-
- GLOVE : GCursor = {The hand with pointing finger cursor}
- (ScreenMask : ($F3FF,$E1FF,$E1FF,$E1FF,
- $E1FF,$E049,$E000,$8000,
- $0000,$0000,$07FC,$07F8,
- $9FF9,$8FF1,$C003,$E007);
- CursorMask : ($0C00,$1200,$1200,$1200,
- $1200,$13B6,$1249,$7249,
- $9249,$9001,$9001,$8001,
- $4002,$4002,$2004,$1FF8);
- HotX : $0004;
- HotY : $0000);
-
- IBEAM : GCursor = {Your normal text entering I shaped cursor}
- (ScreenMask : ($F3FF,$E1FF,$E1FF,$E1FF,
- $E1FF,$E049,$E000,$8000,
- $0000,$0000,$07FC,$07F8,
- $9FF9,$8FF1,$C003,$E007);
- CursorMask : ($0C30,$0240,$0180,$0180,
- $0180,$0180,$0180,$0180,
- $0180,$0180,$0180,$0180,
- $0180,$0180,$0240,$0C30);
- HotX : $0007;
- HotY : $0007);
-
- KKG : GCursor = {KKG symbol, a little sorority stuff}
- (ScreenMask : ($FFFF,$1040,$1040,$0000,
- $0000,$0000,$0411,$0411,
- $0001,$0001,$0001,$1041,
- $1041,$1041,$FFFF,$FFFF );
- CursorMask : ($0000,$0000,$4517,$4515,
- $4925,$5144,$6184,$6184,
- $5144,$4924,$4514,$4514,
- $4514,$0000,$0000,$0000 );
- HotX : $0007;
- HotY : $0005);
-
- SMILEY : GCursor = {a Smiley face for you!}
- (ScreenMask : ($C003,$8001,$07E0,$0000,
- $0000,$0000,$0000,$0000,
- $0000,$0000,$0000,$8001,
- $C003,$C003,$E007,$F81F );
- CursorMask : ($0FF0,$1008,$2004,$4002,
- $4E72,$4A52,$4E72,$4002,
- $4992,$581A,$2424,$13C8,
- $1008,$0C30,$03C0,$0000 );
- HotX : $0007;
- HotY : $0005);
-
- XOUT : GCursor = {a BIG X marks the spot}
- (ScreenMask : ($1FF8,$0FF0,$07E0,$03C0,
- $8181,$C003,$E007,$F00F,
- $F81F,$F00F,$E007,$C003,
- $8181,$03C0,$07E0,$0FF0 );
- CursorMask : ($8001,$C003,$6006,$300C,
- $1818,$0C30,$0660,$03C0,
- $0180,$03C0,$0660,$0C30,
- $1818,$300C,$6006,$C003 );
- HotX : $0007;
- HotY : $0008);
-
- SWORD : GCursor = {For the D&D buffs...}
- (ScreenMask : ($F83F,$F83F,$F83F,$F83F,
- $F83F,$F83F,$F83F,$F83F,
- $8003,$8003,$8003,$8003,
- $8003,$F83F,$F01F,$F01F );
- CursorMask : ($0100,$0380,$0380,$0380,
- $0380,$0380,$0380,$0380,
- $0380,$3398,$3398,$3FF8,
- $0380,$0380,$0380,$07C0 );
- HotX : $0007;
- HotY : $0000);
-
-
- Type
- Position = record
- btnStat,
- opCount,
- Xpos,Ypos : integer;
- end; {record}
-
- Const
- ButtonL = 0;
- ButtonR = 1;
- ButtonM = 2;
- Software = 0;
- Hardware = 1;
-
-
- Type
- GenMouse = object
- X,Y : integer;
- Visible : boolean;
- Function TestMouse : boolean;
- Procedure SetAccel(Threshold : integer);
- Procedure Show(Option : boolean);
- Procedure GetPosition(var BtnStatus,Xpos,Ypos : integer);
- Procedure QueryBtnDn(Button : integer;var mouse : position);
- Procedure QueryBtnUp(Button : integer;var mouse : position);
- Procedure ReadMove(var XMove,YMove : integer);
- Procedure Reset(var Status : boolean;var BtnCount : integer);
- Procedure SetRatio(HorPix,VerPix : integer);
- Procedure SetLimits(XPosMin,YPosMin,XPosMax,YPosMax : integer);
- Procedure SetPosition(XPos,YPos : integer);
- end; {object}
-
- GraphicMouse = object(GenMouse)
- Procedure Initialize;
- Procedure ConditionalHide(Left,Top,Right,Bottom : integer);
- Procedure SetCursor(Cursor : GCursor);
- end; {object}
-
- TextMouse = object(GenMouse)
- Procedure Initialize;
- Procedure SetCursor(Ctype,C1,C2 : word);
- end; {object}
-
- GraphicLightPen = object(GraphicMouse)
- Procedure LightPen(Option : boolean);
- end; {object}
-
- TextLightPen = object(TextMouse)
- Procedure LightPen(Option : boolean);
- end; {object}
-
- {=========================================================================}
-
- Implementation
-
- Uses
- Crt,Graph,Dos;
- Var
- Regs : registers;
-
- {*************************************************************************}
-
- Function Lower(N1,N2 : integer) : integer;
- Begin
- if N1 < N2 then
- Lower := N1
- else
- Lower := N2;
- End;
-
- {*************************************************************************}
-
- Function Upper(N1,N2 : integer) : integer;
- Begin
- if N1 > N2 then
- Upper := N1
- else
- Upper := N2;
- End;
-
- {*************************************************************************}
-
- Function GenMouse.TestMouse : boolean;
- Const
- Iret = 207;
- Var
- dOff,dSeg : integer;
- Begin
- dOff := MemW[0000:0204];
- dSeg := MemW[0000:0206];
- if ((dSeg = 0) or (dOff = 0)) then
- TestMouse := False
- else
- TestMouse := Mem[dSeg:dOff] <> Iret;
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.Reset(var Status : boolean; var BtnCount : integer);
- Begin
- Regs.AX := $00; {Reset to default conditions}
- intr($33,Regs);
- Status := Regs.AX <> 0; {Mouse Present}
- BtnCount := Regs.BX; {Button Count}
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.SetAccel(Threshold : integer);
- Begin
- Regs.AX := $13;
- Regs.DX := Threshold;
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.Show(Option : boolean);
- Begin
- if Option and not Visible then
- begin
- Regs.AX := $01; {Show mouse cursor}
- Visible := True;
- Intr($33,Regs);
- end
- else
- if Visible and not Option then
- begin
- Regs.AX := $02; {Hide mouse cursor}
- Visible := False;
- Intr($33,Regs);
- end;
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.GetPosition(var BtnStatus,Xpos,Ypos : integer);
- Begin
- Regs.AX := $03;
- Intr($33,Regs);
- BtnStatus := Regs.BX;
- Xpos := Regs.CX;
- Ypos := Regs.DX;
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.SetPosition(Xpos,Ypos : integer);
- Begin
- Regs.AX := $04;
- Regs.CX := Xpos;
- Regs.DX := Ypos;
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.SetRatio(HorPix,VerPix : integer);
- Begin
- Regs.AX := $0F;
- Regs.CX := HorPix; {horizonal mickeys/pixel}
- Regs.DX := VerPix; {vertical mickeys/pixel}
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.QueryBtnDn(Button : integer;var Mouse : position);
- Begin
- Regs.AX := $05;
- Regs.BX := Button;
- Intr($33,Regs);
- Mouse.BtnStat := Regs.AX;
- Mouse.OpCount := Regs.BX;
- Mouse.Xpos := Regs.CX;
- Mouse.Ypos := Regs.DX;
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.QueryBtnUp(Button : integer;var Mouse : position);
- Begin
- Regs.AX := $06;
- Regs.BX := Button;
- Intr($33,Regs);
- Mouse.BtnStat := Regs.AX;
- Mouse.OpCount := Regs.BX;
- Mouse.Xpos := Regs.CX;
- Mouse.Ypos := Regs.DX;
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.SetLimits(XPosMin,YPosMin,XPosMax,YPosMax : integer);
- Begin
- Regs.AX := $07; {horizonal limits}
- Regs.CX := Lower(XPosMin,XPosMax);
- Regs.DX := Upper(XPosMin,XPosMax);
- Intr($33,Regs);
- Regs.AX := $08; {vertical limits}
- Regs.CX := Lower(YPosMin,YPosMax);
- Regs.DX := Upper(YPosMin,YPosMax);
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GenMouse.ReadMove(var XMove,YMove : integer);
- Begin
- Regs.AX := $0B;
- Intr($33,Regs);
- XMove := Regs.CX;
- YMove := Regs.DX;
- End;
-
- {*************************************************************************}
-
- {=======================================}
- {Implementation methods for GraphicMouse}
- {=======================================}
-
- Procedure GraphicMouse.SetCursor(Cursor : GCursor);
- Begin
- Regs.AX := $09;
- Regs.BX := Cursor.HotX;
- Regs.CX := Cursor.HotY;
- Regs.DX := Ofs(Cursor.ScreenMask);
- Regs.ES := Seg(Cursor.ScreenMask);
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GraphicMouse.ConditionalHide(Left,Top,Right,Bottom : integer);
- Begin
- Regs.AX := $0A;
- Regs.CX := Left;
- Regs.DX := Top;
- Regs.SI := Right;
- Regs.DI := Bottom;
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GraphicMouse.Initialize;
- Begin
- Visible := False;
- SetLimits(0,0,GetMaxX,GetMaxY);
- SetCursor(Arrow);
- SetPosition(GetMaxX div 2,GetMaxY div 2);
- Show(True);
- End;
-
- {*************************************************************************}
-
- {====================================}
- {Implementation methods for TextMouse}
- {====================================}
-
- Procedure TextMouse.Initialize;
- Begin
- Visible := False;
- SetLimits(Lo(WindMin)*8,Hi(WindMin)*8,Lo(WindMax)*8,Hi(WindMax)*8);
- SetCursor(Hardware,6,7);
- SetPosition(0,0);
- Show(True);
- End;
-
- {*************************************************************************}
-
- Procedure TextMouse.SetCursor(CType,C1,C2 : word);
- Begin
- Regs.AX := $0A; {function 10h}
- Regs.BX := CType; {0=software,1=hardware}
- Regs.CX := C1; {screen mask or scan start line}
- Regs.DX := C2; {screen mask or scan stop line}
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- {===================================}
- {Implementation methods for LightPen}
- {===================================}
-
- Procedure TextLightPen.LightPen(Option : boolean);
- Begin
- if Option then
- Regs.AX := $0D
- else
- Regs.AX := $0E;
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- Procedure GraphicLightPen.LightPen(Option : boolean);
- Begin
- if Option then
- Regs.AX := $0D
- else
- Regs.AX := $0E;
- Intr($33,Regs);
- End;
-
- {*************************************************************************}
-
- BEGIN
- END.
-